package com.tianhao.export;

/**
 * 报表功能得增强，支持导出
 *
 * @author： 76875
 * @date： 2022/4/22 星期五 9:29
 * @description：
 * @modifiedBy：
 * @version: 1.0
 */
public interface SimpleExport<T, R> extends SimpleReport<T, R> {
    ///**
    // * 导出报表
    // *
    // * @param response      下载流
    // * @param condition     本次报表导出数据查询条件
    // * @param reportClz     报表返回DTO的类型
    // * @param comparator    报表返回数据的排序构造器，视数据而定，可为空
    // * @param continueField 报表数据内容超过{@link ExcelFileName#pageSize()}时，如果需要对所有数据进行切割，如果本字段不为空，表示到达临界值时要延续
    // * @param extraMap      额外参数
    // * @param <C>           临界数据延续的数据类型
    // */
    //default <C> void simpleExportExcel(HttpServletResponse response,
    //                                   T condition,
    //                                   Class<R> reportClz,
    //                                   Comparator<R> comparator,
    //                                   KnifeListSplitUtil.ContinueField<R, C> continueField,
    //                                   Map<String, Object> extraMap) {
    //    ExcelWriter excelWriter = null;
    //    ServletOutputStream outputStream = null;
    //    try {
    //        // 导出前置操作
    //        preExport(response, reportClz);
    //
    //        // 提供数据
    //        List<R> completeDate = queryReport(condition, extraMap);
    //
    //        // 获取输出流
    //        outputStream = response.getOutputStream();
    //
    //        // 导出excel
    //        excelWriter = exportExcel(outputStream, reportClz, completeDate, comparator, continueField);
    //    } catch (Exception e) {
    //        e.printStackTrace();
    //    } finally {
    //        // 导出后操作
    //        afterExport(excelWriter, outputStream);
    //    }
    //}
    //
    //
    ///**
    // * 初始化文件导出的基本信息
    // */
    //default <C> void preExport(HttpServletResponse response,
    //                           Class<R> reportClz) {
    //    //获取导出文件的名称
    //    ExcelFileName serviceAnnotation = reportClz.getAnnotation(ExcelFileName.class);
    //    String fileName = serviceAnnotation.value();
    //    String downloadName = fileName + new SimpleDateFormat("yyyyMMdd").format(new Date());
    //    KnifeHttpServletResponseHelper knifeHttpServletResponseHelper = new KnifeHttpServletResponseHelper(response);
    //    knifeHttpServletResponseHelper.setContentType(MediaType.ALL)
    //            .setCharacterEncoding(StandardCharsets.UTF_8)
    //            .setExportFileName(StandardCharsets.UTF_8, downloadName, "xlsx");
    //}
    //
    //
    ///**
    // * 导出后操作
    // */
    //default void afterExport(ExcelWriter excelWriter, ServletOutputStream outputStream) {
    //    if (excelWriter != null) {
    //        excelWriter.finish();
    //    }
    //    // 记得手动关闭输出流，否则会出现导出文件失败的情况
    //    if (outputStream != null) {
    //        try {
    //            outputStream.close();
    //        } catch (IOException e) {
    //            throw new RuntimeException(e);
    //        }
    //    }
    //}
    //
    ///**
    // * 导出报表
    // *
    // * @param outputStream  下载流
    // * @param reportClz     报表返回DTO的类型
    // * @param comparator    报表返回数据的排序构造器，视数据而定，可为空
    // * @param continueField 报表数据内容超过{@link ExcelFileName#pageSize()}时，如果需要对所有数据进行切割，如果本字段不为空，表示到达临界值时要延续
    // * @param <C>           临界数据延续的数据类型
    // */
    //default <C> ExcelWriter exportExcel(ServletOutputStream outputStream,
    //                                    Class<R> reportClz,
    //                                    List<R> exportList,
    //                                    Comparator<R> comparator,
    //                                    KnifeListSplitUtil.ContinueField<R, C> continueField) throws IOException {
    //    //获取导出文件的名称
    //    ExcelFileName serviceAnnotation = reportClz.getAnnotation(ExcelFileName.class);
    //    String fileName = serviceAnnotation.value();
    //    //每个sheet页的数据
    //    int pageSize = serviceAnnotation.pageSize();
    //    //设置第几列合并
    //    int[] mergeColumnIndex = serviceAnnotation.mergeColumnIndex();
    //    //需要从第几行开始合并
    //    int mergeRowIndex = serviceAnnotation.mergeRowIndex();
    //    ExcelWriter excelWriter = EasyExcel.write(outputStream, reportClz).build();
    //    if (CollectionUtils.isEmpty(exportList)) {
    //        exportList = Collections.emptyList();
    //    }
    //    List<List<R>> lists = KnifeListSplitUtil.splitList(pageSize, exportList, comparator, continueField);
    //
    //    for (int i = 1; i <= lists.size(); i++) {
    //        ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel.writerSheet(i, fileName + "-" + i);
    //        if (mergeColumnIndex.length == 0) {
    //            WriteSheet writeSheet = excelWriterSheetBuilder.build();
    //            excelWriter.write(lists.get(i - 1), writeSheet);
    //        } else {
    //            //合并策略
    //            ExcelFillCellMergeStrategy mergeStrategy = new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumnIndex);
    //            WriteSheet writeSheet = excelWriterSheetBuilder
    //                    .registerWriteHandler(mergeStrategy).build();
    //            excelWriter.write(lists.get(i - 1), writeSheet);
    //        }
    //    }
    //    return excelWriter;
    //}
}
